/* (a-(b+c))*(d/e)存储在二叉树，遍历求值 */
#include <iostream>
#include "BiTreefun.h"
using namespace std;

// 二元运算操作
int op(char A, char B, char C)
{
  switch (C)
  {
  case '+':
    return A + B;
    break;
  case '-':
    return A - B;
    break;
  case '*':
    return A * B;
    break;
  case '/':
    return A / B;
    break;
  default:
    break;
  }
  
  // 运算失败
  return -100;
}

// 计算表达式
int comp(BTNode *p)
{
  int A, B;
  
  // 二叉树为空
  if (p == NULL)
    return 0;
  
  // 二叉树不为空
  if (p != NULL)
  {
    // 同时存在左右结点
    if (p->lchild != NULL && p->rchild != NULL)
    {
      // 计算左子树的值
      A = comp(p->lchild);
      
      // 计算右子树的值
      B = comp(p->rchild);
      
      // 运算
      return op(A, B, p->data);
    }
    
    // 否则
    else
      return p->data - '0'; // 直接返回根结点的值
  }
  
  // 计算失败
  return -100;
}

// 打印二叉树中存储的表达式
void func(BTNode *p, int deep){
  
  // 二叉树不为空
  if(p!=NULL)
  {
    
    if((p->lchild&&p->rchild)&&deep>=1)
      cout<<'(';
    
    deep++;
    
    // 打印左子树中存储的表达式
    func(p->lchild, deep+1);
    
    // 打印根结点
    cout<<p->data;
    
    // 打印右子树中存储的表达式
    func(p->rchild, deep+1);
    
    deep--;
    
    if((p->lchild&&p->rchild)&&deep>=1)
      cout<<')';
  }
}

int main()
{
  // 创建二叉树
  BTNode *T = create_bitree();
  
  // 记录深度
  int deep=0;
  
  // 计算表达式
  cout<<"result1:";
  func(T, deep);
  cout<<endl;
  
  // 计算表达式
  int a = comp(T);
  cout << "result2 : " << a << endl;
}
